/*
================================================================================
	Plik: f_inc.c
--------------------------------------------------------------------------------
	Autorzy: Piotr Zdunek, Mateusz Słowikowski, Krzysztof Wiąckowski
	Projekt:Model mikrokontrolera AVR
	Kompilator: avr-gcc-4.3.5
	Doc: doxygen 1.7.4
--------------------------------------------------------------------------------
	Zawiera:
--------------------------------------------------------------------------------
	Komentarze:
================================================================================
*/

/*! \file f_inc.c
 * \brief Plik opisujący funkcję INC
 */

#include "types.h"
#include "mem_abs.h"

// ******************************************************************************
//INC - funkcja zwiększająca wartosć danego rejestru o 1
// ******************************************************************************


void F_INC(void){
	/*!  void F_INC(void){}
	 *  \n \n
	 *  INC - funkcja zwiększająca wartosć danego rejestru o 1 \n
	 *
	 *  \ref pageinc \n
	 */

#ifndef  DEBUG_MODE
	printf("Function INC.");
#endif
//Pobranie numeru rejestru i jego wartości z instrukcji
	int Rd_temp = (getMEMC(getPC()) & 0x0FF0) >> 4;
	uint8_t Rd = (Rd_temp & 0b00011111);
	uint8_t Rd_val = getRegister(Rd) % MAX_DATA_VAL;
	uint8_t R = Rd_val + 1;									//Zwiększenie wartości o 1

	setRegister(Rd,R);										//Zapisanie wartosci do rejestru
    incPC();												//Zwiększenie licznika rozkazów

															// USTAWIENIE REJESTRU FLAG
  	if(Rd_val == 127) SetFlagRegisterBit(FLAG_V); 					// Ustawienie flagi V
  	else ClearFlagRegisterBit(FLAG_V);

    if( ( (Rd & 0x80) >> 7) == 0 && ((R & 0x80) >> 7) == 1) // Jeśli MSB Rd == 0 i MSB R == 1 to zmieniamy
      	SetFlagRegisterBit(FLAG_N);									// bo nastąpiła zmiana MSB
    else
       	ClearFlagRegisterBit(FLAG_N);

    if( R == 0 ) SetFlagRegisterBit( FLAG_Z );						//Ustawienie flagi Z
   	else ClearFlagRegisterBit( FLAG_Z );

   	if( (GetFlagRegisterStatus(FLAG_N) ^ GetFlagRegisterStatus(FLAG_V)) == 1 ){
   		SetFlagRegisterBit(FLAG_S); 								//Ustawienie flagi S
   	}
   	else ClearFlagRegisterBit(FLAG_S);

}
/*! \page pageinc Opis działania funkcji INC
 *
 *	\dontinclude f_inc.c
 *
 *	\section sec_inc1 Operacje rejestrowe oraz arytmetyczno-logiczne
 *
 *	1. Pobranie numeru rejestru i jego wartości z instrukcji:
 *	\skipline getMEMC
 *	\until MAX_DATA_VAL
 *	2. Zwiększenie wartości o 1:
 *	\skipline R
 *	3. Zapisanie wartosci do rejestru:
 *	\skipline setRegister
 *	4. Zwiększenie licznika rozkazów:
 *	\skipline incPC
 *
 *	\section sec_inc2 Operacje na flagach
 *
 *	1. Ustawienie flagi V:
 *	\line if
 *	\until else
 *	2. Ustawienie flagi N
 *	\line if
 *	\until ClearFlagRegisterBit
 *	3. Ustawienie flagi Z
 *	\line if
 *	\until ClearFlagRegisterBit
 *	4. Ustawienie flagi S
 *	\line if
 *	\until ClearFlagRegisterBit
 *
 *	\section sec_inc3 Kod źródłowy funkcji
 *
 *	\include f_inc.c
 *
 */
